gusucode.com > 各种VC自绘控件源码程序 > 各种VC自绘控件源码/code/SkinControls(自绘MFC基本控件 )/SkinControls/SkinControls/SkinCheckBox.cpp

    
#include "stdafx.h"
#include "SkinCheckBox.h"


IMPLEMENT_DYNAMIC(CSkinCheckBox, CButton)

BEGIN_MESSAGE_MAP(CSkinCheckBox, CButton)
	ON_WM_CREATE()
	ON_CONTROL_REFLECT_EX(BN_CLICKED, OnClicked)
	ON_WM_ERASEBKGND()
	ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()


//////////////////////////////////////////////////////////////////////////

CSkinCheckBox::CSkinCheckBox()
{
	m_bChecked = FALSE;
	m_crTextColor = RGB(0,0,0);
	m_crBack = RGB(255,255,255);
	m_bSetBack = false;
}

CSkinCheckBox::~CSkinCheckBox()
{
}


void CSkinCheckBox::PreSubclassWindow() 
{
	CButton::PreSubclassWindow();
	ModifyStyle(0, BS_OWNERDRAW);
	//ModifyStyleEx(0, WS_EX_TRANSPARENT);
}

//建立消息
int CSkinCheckBox::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (__super::OnCreate(lpCreateStruct)==-1) return -1;
	ModifyStyle(0, BS_OWNERDRAW);
	//ModifyStyleEx(0, WS_EX_TRANSPARENT);

	return 0;
}

HBRUSH CSkinCheckBox::CtlColor(CDC* pDC, UINT nCtlColor)
{
	pDC->SetBkMode(TRANSPARENT);
	return (HBRUSH)GetStockObject(NULL_BRUSH);
}

void CSkinCheckBox::DrawItem(LPDRAWITEMSTRUCT lpDIS) 
{
	CDC* pDC = CDC::FromHandle(lpDIS->hDC);
	CRect rcItem(lpDIS->rcItem);

	if (m_bSetBack)
	{
		pDC->FillSolidRect(&rcItem, m_crBack);
		m_ImageBack.Draw(pDC->m_hDC, rcItem.left, rcItem.top);
	}

	int nCheckWidth = (int)m_ImageCheck.GetWidth()/4;
	int nCheckHeight = (int)m_ImageCheck.GetHeight();
	if (m_bChecked && this->IsWindowEnabled()) m_ImageCheck.Draw(pDC->m_hDC, rcItem.left, rcItem.Height()/2-nCheckHeight/2, nCheckWidth,nCheckHeight, 2*nCheckWidth, 0, nCheckWidth,nCheckHeight);
	else if (!this->IsWindowEnabled() && m_bChecked) m_ImageCheck.Draw(pDC->m_hDC, rcItem.left, rcItem.Height()/2-nCheckHeight/2, nCheckWidth,nCheckHeight, 3*nCheckWidth, 0, nCheckWidth,nCheckHeight);
	else if (this->IsWindowEnabled() && !m_bChecked) m_ImageCheck.Draw(pDC->m_hDC, rcItem.left, rcItem.Height()/2-nCheckHeight/2, nCheckWidth,nCheckHeight, 0, 0, nCheckWidth,nCheckHeight);
	else if (!this->IsWindowEnabled() && !m_bChecked) m_ImageCheck.Draw(pDC->m_hDC, rcItem.left, rcItem.Height()/2-nCheckHeight/2, nCheckWidth,nCheckHeight, nCheckWidth, 0, nCheckWidth,nCheckHeight);
	

	CString strText;
	GetWindowText(strText);
	CFont font;
	font.CreateFont(-12,0,0,0,400,0,0,0,134,3,2,1,2,TEXT("宋体"));
	pDC->SelectObject(&font);
	pDC->SetTextColor(m_crTextColor);
	pDC->TextOut(nCheckWidth+4, rcItem.Height()/2-nCheckHeight/2+1, strText);
}

void CSkinCheckBox::SetCheckBoxTextColor(COLORREF crTextColor)
{
	m_crTextColor = crTextColor;
}

void CSkinCheckBox::SetCheckImage(HRSRC hRes, DWORD imagetype, HMODULE hModule)
{
	//加载位图
	m_ImageCheck.LoadResource(hRes, imagetype, hModule);
	m_ImageCheck.SetTransIndex(0);
	m_ImageCheck.SetTransColor(CxImage::RGBtoRGBQUAD(TRANS_COLOR));
}

void CSkinCheckBox::SetCheckImage(LPCTSTR pszFileName, DWORD imagetype)
{
	//效验参数
	ASSERT(pszFileName);
	if (pszFileName==NULL) return ;

	//加载位图
	m_ImageCheck.Load(pszFileName,imagetype);
	m_ImageCheck.SetTransIndex(0);
	m_ImageCheck.SetTransColor(CxImage::RGBtoRGBQUAD(TRANS_COLOR));
}

void CSkinCheckBox::SetBackImage(LPCTSTR pszFileName, DWORD imagetype)
{
	//效验参数
	ASSERT(pszFileName);
	if (pszFileName==NULL) return ;

	//加载位图
	m_bSetBack = true;
	m_ImageBack.Load(pszFileName,imagetype);
	SetWindowPos(NULL, 0, 0, m_ImageBack.GetWidth(), m_ImageBack.GetHeight(), SWP_NOMOVE);
}


BOOL CSkinCheckBox::OnClicked() 
{
	if (!m_bChecked)
		m_bChecked = TRUE;
	else
		m_bChecked = FALSE;

	RedrawWindow();

	return FALSE;
}

BOOL CSkinCheckBox::OnEraseBkgnd(CDC* pDC)
{
	return TRUE;
}


//////////////////////////////////////////////////////////////////////////